package net.xdclass.strategy;

import net.xdclass.common.WeightCategory;

import java.util.List;
import java.util.Random;

public class WeightConfig {

    /**
     * 权重获取方法
     * 根据传入的权重类别列表，随机选择一个类别并返回其名称
     * @param categorys 权重类别列表
     * @return
     */
    public static String getCategory(List<WeightCategory> categorys) {
        // 初始化总权重累加器
        Integer weightSum = 0;
        // 初始化返回结果
        String result=null;

        // 计算所有权重类别的总权重
        for (WeightCategory wc : categorys) {
            weightSum += wc.getWeight();
        }

        // 如果总权重小于等于0，则打印错误信息并返回空结果
        if (weightSum <= 0) {
            System.err.println("Error: weightSum=" + weightSum.toString());
            return result;
        }

        // 生成一个随机数对象
        Random random = new Random();
        // 生成一个在总权重范围内的随机数
        Integer n = random.nextInt(weightSum); // n in [0, weightSum)
        // 初始化权重累加器
        Integer m = 0;

        // 遍历权重类别列表，确定结果
        for (WeightCategory wc : categorys) {
            // 判断随机数落在哪个权重范围内
            if (m <= n && n < m + wc.getWeight()) {
                // 设置结果并结束循环
                result=wc.getCategory();
                break;
            }
            // 更新权重累加器
            m += wc.getWeight();
        }
        // 返回结果
        return result;
    }

}

